// [前端模块化规范]

//    AMD(Asynchronous Module Definition):异步模块定义规范.
// 专门用于浏览器端,模块的加载是异步的.
// AMD主要通过require.js实现模块化.(通过define方法,将代码定义成模块;通过require方法,实现代码的模块加载.)
// 目前很少用,了解即可
// 在require.js中,使用require.js提供的函数require()来应用一个模块
require(['模块文件的路径(不带.js后缀)',function(){
    //模块加载成功之后的回调函数
}])

// CMD(Common Module Definition):公共模块定义规范.
// CMD是另一种模块方案,类似AMD.
// 不同点在于:AMD推崇前置,提前执行;CMD推崇依赖就近,延迟执行.
// 
// 了解就行

// 使用define函数,传入的一般是一个函数,这个函数接受三个参数,分别是require,exports,module
define(function(require,exports,module){
    const a = require('a')//同步导入
    const b = require.async('b',function(b){
        console.log(b);
    })//异步导入
})

//commomJS
// node.js是commomJS的主要实践者,   node.js中内置CommomJS

// [概述]
// 每一个文件就是模块,有自己的作用域.在一个文件里面定义的变量,函数,类,都是私有的,对其他文件不可见.
// 在服务器端,模块的加载是运行时同步加载的,在浏览器端,模块需要提前编译打包处理的.


// 特点
// 所有的代码都运行在模块作用域,不会污染全局作用域.
// 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果.
// 模块加载的顺序,按照其在代码中出现的顺序.

// [语法]
// 暴露模块
// module exports = value
// exports xxx value
// 引入模块
// require(xxx)
// 在第三方模块中,xxx为模块名.在定义模块中,xxx为模块文件路径

// ESM(常用,JS官方语法,vue中使用):ES6 module
// ES6在语言标准的层面上,实现了模块功能,逐渐会成为浏览器和服务器通用的模块解决方案.

// 导出模块:export
// 引入模块:import